package cc.owoo.godpen.network.http;

import cc.owoo.godpen.file.SuperFile;
import cc.owoo.godpen.util.N;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.Objects;

/**
 * 请求缓存，给HttpClient设置一个缓存路径，所有请求文件都会缓存到改目录，方便爬虫玩家调试
 * <p>
 * 如果没有设置路径，则默认路径为：C:/ProgramData/JavaHttpClient
 * <p>
 * Created by nimensei
 * 2022-05-02 上午 10:23
 **/
public class RequestCache {
    private final File root;// 根目录
    private final HashSet<String> fileSet = new HashSet<>();// 存在的文件

    /**
     * 路径：C:/ProgramData/JavaHttpClient
     * <p>
     * 每次执行构造函数时，都会对缓存路径中的文件进行修改日期判断，如果是一周前，则会将文件删除
     */
    public RequestCache() {
        this(new File("C:/ProgramData/Godpen/cache"));
    }

    /**
     * 在自定义路径创建环境
     * <p>
     * 每次执行构造函数时，都会对缓存路径中的文件进行修改日期判断，如果是一周前，则会将文件删除
     *
     * @param root 自定义路径
     */
    public RequestCache(File root) {
        if (!root.isDirectory())
            if (!root.mkdirs())
                throw new IllegalArgumentException("文件夹创建失败");
        this.root = root;
        long time = System.currentTimeMillis();
        long maxAge = 604800000;
        for (String s : Objects.requireNonNull(root.list())) {
            File file = new File(this.root + "/" + s);
            if (!file.isFile())
                continue;
            if (time - file.lastModified() >= maxAge) {
                try {
                    if (file.delete())
                        continue;
                } catch (Exception ignored) {
                }
            }
            fileSet.add(s);
        }
    }

    /**
     * 设置数据
     *
     * @param url  URL
     * @param data 数据
     */
    public void set(String url, byte[] data) {
        if (url == null)
            throw new NullPointerException("URL不能为空");
        url = N.md5(url.getBytes(StandardCharsets.UTF_8));
        String path = root + "/" + url;
        File file = new File(path);
        try {
            SuperFile.write(file, data);
        } catch (IOException ignored) {
        }
        synchronized (fileSet) {
            fileSet.add(url);
        }
    }

    /**
     * 获取数据
     *
     * @param url 需要获取的URL
     * @return 数据
     */
    public byte[] get(String url) {
        if (url == null)
            throw new NullPointerException("URL不能为空");
        url = N.md5(url.getBytes());
        File file;
        synchronized (fileSet) {
            if (!fileSet.contains(url))
                return null;
            String path = root + "/" + url;
            file = new File(path);
            if (!file.isFile()) {
                fileSet.remove(url);
                return null;
            }
        }
        try {
            return SuperFile.read(file);
        } catch (IOException ignored) {
        }
        return null;
    }

    /**
     * 获取根目录
     *
     * @return 根目录
     */
    public File getRoot() {
        return root;
    }

    /**
     * 清空缓存
     */
    public void clear() {
        File[] files = root.listFiles();
        if (files == null || files.length == 0)
            return;
        SuperFile.threadDeleteList(files.length > 100 ? 30 : 3, root.listFiles());
    }
}
